# 自定义响应内容
from rest_framework_jwt.utils import jwt_payload_handler   # 带----是推荐使用
import re
from .models import User

#  通过阅读jwt官方文档得知
def jwt_response_payload_dandler(token,user=None,request=None):
    """
    指定jwt返回数据的格式
    :param token:
    :param user:
    :param request:
    :return:
    """
    return{
        'token':token,
        'user_id':user.id,
        'username':user.username
    }


# 将token载荷中的email删除
def my_jwt_payload_handler(user):
    # 获取默认字典
    payload = jwt_payload_handler(user)
    # 删除email
    del payload['email']
    # 添加mobile属性
    payload['mobile'] = user.mobile
    return payload

# authenticate参数可借助views中ModelBackend找到
class MyAuthenticate(object):
    # 类可以自定义，但是方法名称必须是authenticate（），不能变
    def authenticate(self,request,username=None,password=None,**kwargs):
        # 1.判断username是手机号还是用户名
        if re.match(r'^1[3-9]\d{9}$',username):
            # 2.如果是手机号，则使用mobile查询
            try:
                user = User.objects.get(mobile=username)
            except:
                return None
        else:
            # 3.如果是用户名，则是用username查询
            try:
                user = User.objects.get(username=username)
            except:
                return None
        # 4.判断密码   user对象中提供了一个加密的方法check_password
        # if user.password=password  一般思想，但是这个密码不加密
        if user.check_password(password):
            # 密码正确，返回对象
            return user
        else:
            # 密码错误，返回None
            return None
        # 5.# 返回:如果正确则返回对象，如果不正确则返回None


# 若有用户将手机号设置为用户名，可以将正则验证取消掉，直接进行判断即可
